package com.powernode.customer.controller;

import com.powernode.common.annotation.PowerLogin;
import com.powernode.common.constant.RedisConstant;
import com.powernode.common.result.Result;
import com.powernode.common.util.AuthContextHolder;
import com.powernode.customer.service.CustomerService;
import com.powernode.model.form.customer.UpdateWxPhoneForm;
import com.powernode.model.vo.customer.CustomerLoginVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * 客户控制器
 * 处理客户相关的API请求，包括登录和获取用户信息等功能
 */
@Slf4j
@Tag(name = "客户API接口管理")
@RestController
@RequestMapping("/customer")
@SuppressWarnings({"unchecked", "rawtypes"})
public class CustomerController {
    // 注入客户服务
    @Resource
    private CustomerService customerService;
    // 注入Redis模板
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 小程序授权登录
     *
     * @param code 微信登录凭证
     * @return 登录token
     */
    @Operation(summary = "小程序授权登录")
    @GetMapping("/login/{code}")
    public Result<String> login(@PathVariable String code) {
        // 调用服务层登录方法
        return Result.ok(customerService.login(code));
    }

    /**
     * 获取登录用户信息
     *
     * @param token 用户token
     * @return 用户信息
     */
    @PowerLogin
    @Operation(summary = "获取登录用户信息")
    @GetMapping("/getCustomerLoginInfo")
    public Result<CustomerLoginVo> getCustomerLoginInfo(@RequestHeader(value = "token") String token) {
        // 从Redis获取用户ID
        // String customerId = (String) redisTemplate.opsForValue().get(RedisConstant.USER_LOGIN_KEY_PREFIX + token);
        // 从AuthContextHolder获取用户ID
        Long customerId = AuthContextHolder.getUserId();
        // 移除AuthContextHolder中的用户ID
        AuthContextHolder.removeUserId();
        // 调用服务获取用户信息
        return Result.ok(customerService.getCustomerLoginInfo(Long.valueOf(customerId)));
    }


    /**
     * 更新微信手机号接口，个人开发者无法获取，这里直接返回true
     *
     * @param updateWxPhoneForm 更新手机号表单
     * @return 操作结果
     */
    @Operation(summary = "更新手机号")
    @PostMapping("/updateWxPhone")
    public Result<Boolean> updateWxPhone(@RequestBody UpdateWxPhoneForm updateWxPhoneForm) {
        // return Result.ok(customerService.updatePhone(updateWxPhoneForm));
        return Result.ok(true);
    }
}

